expect介绍 expect是一个自动交互功能的工具,可以满足代替我们实际工作中需要从终端手动输入某些内容来使得程序或命令继续运行的目的。如安装软件是时的一些提示,ssh远程主机执行命令时需要多次输入密码的情况 expect主要命令代码语言:javascript复制spawn 启动新进程,用于执行shell命令
send 发送字符串给expect控制的进程
set 设置变量 set user root
expect 从发起交互的命令的进程接受字符串,用于匹配我们预想的字符串
exp_continue 继续执行接下来的交互操作
set timeout -1 设置超时时间 永远等待
set timeout 10 设置超时时间 10秒
interact 将脚本的控制权交给用户,用户继续使用shell执行命令
$argv expect 脚本可以接受从bash传递过来的参数安装expect代码语言:javascript复制yum install expect免密码通过SSH登录服务器代码语言:javascript复制[root@linux /]# vim ssh.exp
#!/usr/bin/expect
set ip "172.16.0.8"
set user "root"
set pwd "123456"
spawn ssh $user@$ip
expect {
"yes/no" { send "yes\r"; exp_continue } #exp_continue 未出现时继续往下执行
"password" { send "$pwd\r" } # \r 是回车的意思
}
interact
[root@linux /]# expect ssh.exp
spawn ssh [email protected]
[email protected]'s password:
Last login: Thu Aug 6 13:51:42 2020 from www.www.www
[root@nginx1 ~]# ifconfig ens33|sed -n '2p'|awk '{print $2}'
172.16.0.8
[root@nginx1 ~]# exit
登出
Connection to 172.16.0.8 closed.
[root@linux /]# 批量获取在线的IP地址机进行批量秘钥分发代码语言:javascript复制[root@linux /]# vim ssh.sh
#!/bin/bash
>ip.txt
#判断公钥是否生成
if [ ! -f ~/.ssh/id_rsa ]
then
ssh-keygen -P "" -f ~/.ssh/id_rsa
fi
#获取在线的主机
for i in {3..20}
do
ping -c1 -w1 172.16.0.$i &>/dev/null
if [ $? -eq 0 ];then
echo 172.16.0.$i >>ip.txt
fi
done
#批量分发秘钥
pass=123456
while read line
do
/usr/bin/expect |